home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / btree.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  8KB  |  297 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16.  
  17. #define    CLASS    BTree_c
  18. #define    ivType    BTree_iv_t
  19.  
  20. #include "generics.h"
  21.  
  22. object    BTree_c;
  23.  
  24.  
  25. #line 26 "btree.c"
  26. typedef struct  _BTree_iv_t  {
  27.     object iNodes;
  28.     long iNum;
  29.     ifun iCmpFun;
  30.     CRITICALSECTION iCS;
  31. }    BTree_iv_t;
  32.  
  33.  
  34.  
  35. #line 26 "btree.d"
  36. imeth ofun BTree_im_gSetFunction(object self, int (*fun)())
  37. { BTree_iv_t *iv = GetIVs(BTree, self);
  38.     ofun old = (ofun) iv->iCmpFun; 
  39.     iv->iCmpFun = fun; 
  40.     return old; 
  41.  
  42. cmeth objrtn BTree_cm_gNew(object self)
  43.     object obj = oSuper(BTree_c, gNew, self)(self); 
  44.     accessIVsOf(obj); 
  45.     INITIALIZECRITICALSECTION(iv->iCS); 
  46.     return obj; 
  47.  
  48. imeth objrtn BTree_im_gDeepDispose(object self)
  49. { BTree_iv_t *iv = GetIVs(BTree, self);
  50.     ENTERCRITICALSECTION(iv->iCS); 
  51.     if (iv->iNodes) 
  52.         gDeepDispose(iv->iNodes); 
  53.     LEAVECRITICALSECTION(iv->iCS); 
  54.     DELETECRITICALSECTION(iv->iCS); 
  55.     return oSuper(BTree_c, gDispose, self)(self); 
  56.  
  57. imeth objrtn BTree_im_gDispose(object self)
  58. { BTree_iv_t *iv = GetIVs(BTree, self);
  59.     ENTERCRITICALSECTION(iv->iCS); 
  60.     if (iv->iNodes) 
  61.         gDispose(iv->iNodes); 
  62.     LEAVECRITICALSECTION(iv->iCS); 
  63.     DELETECRITICALSECTION(iv->iCS); 
  64.     return oSuper(BTree_c, gDispose, self)(self); 
  65.  
  66. imeth objrtn BTree_im_gDeepDisposeAllNodes(object self)
  67. { BTree_iv_t *iv = GetIVs(BTree, self);
  68.     ENTERCRITICALSECTION(iv->iCS); 
  69.     if (iv->iNodes) 
  70.         iv->iNodes = gDeepDispose(iv->iNodes); 
  71.     iv->iNum = 0; 
  72.     LEAVECRITICALSECTION(iv->iCS); 
  73.     return self; 
  74.  
  75. imeth objrtn BTree_im_gDisposeAllNodes(object self)
  76. { BTree_iv_t *iv = GetIVs(BTree, self);
  77.     ENTERCRITICALSECTION(iv->iCS); 
  78.     if (iv->iNodes) 
  79.         iv->iNodes = gDispose(iv->iNodes); 
  80.     iv->iNum = 0; 
  81.     LEAVECRITICALSECTION(iv->iCS); 
  82.     return self; 
  83.  
  84. imeth int BTree_im_gSize(object self)
  85. { BTree_iv_t *iv = GetIVs(BTree, self);
  86.     return iv->iNum; 
  87.  
  88. imeth objrtn BTree_im_gSetTopNode(object self, object new)
  89. { BTree_iv_t *iv = GetIVs(BTree, self);
  90.     iv->iNodes = new; 
  91.     return self; 
  92.  
  93. imeth objrtn BTree_im_gAddValue(object self, object key, object val)
  94. { BTree_iv_t *iv = GetIVs(BTree, self);
  95.     object old=NULL; 
  96.     int replaced; 
  97.  
  98.     ENTERCRITICALSECTION(iv->iCS); 
  99.     if (!iv->iNodes) { 
  100.         if (!iv->iCmpFun) 
  101.             iv->iCmpFun = gCompare; 
  102.         iv->iNodes = gNewNode(BTreeNode, self, 2); 
  103.     } 
  104.     gAddBTreeNode(iv->iNodes, iv->iCmpFun, key, val, 1, &replaced, NULL, &old); 
  105.     if (replaced == 1) 
  106.         iv->iNum++; 
  107.     LEAVECRITICALSECTION(iv->iCS); 
  108.     return old; 
  109.  
  110. imeth objrtn BTree_im_gFindEQ(object self, object key, object *foundKey)
  111. { BTree_iv_t *iv = GetIVs(BTree, self);
  112.     object r; 
  113.     ENTERCRITICALSECTION(iv->iCS); 
  114.     r = iv->iNodes && iv->iNum ? gFindBTNEQ(iv->iNodes, iv->iCmpFun, key, foundKey) : NULLOBJ; 
  115.     LEAVECRITICALSECTION(iv->iCS); 
  116.     return r; 
  117.  
  118. imeth objrtn BTree_im_gFindGE(object self, object key, object *foundKey)
  119. { BTree_iv_t *iv = GetIVs(BTree, self);
  120.     object r; 
  121.     ENTERCRITICALSECTION(iv->iCS); 
  122.     r = iv->iNodes && iv->iNum ? gFindBTNGE(iv->iNodes, iv->iCmpFun, key, foundKey) : NULLOBJ; 
  123.     LEAVECRITICALSECTION(iv->iCS); 
  124.     return r; 
  125.  
  126. imeth objrtn BTree_im_gFindGT(object self, object key, object *foundKey)
  127. { BTree_iv_t *iv = GetIVs(BTree, self);
  128.     object r; 
  129.     ENTERCRITICALSECTION(iv->iCS); 
  130.     r = iv->iNodes && iv->iNum ? gFindBTNGT(iv->iNodes, iv->iCmpFun, key, foundKey) : NULLOBJ; 
  131.     LEAVECRITICALSECTION(iv->iCS); 
  132.     return r; 
  133.  
  134. imeth objrtn BTree_im_gFindNext(object self, object *foundKey)
  135. { BTree_iv_t *iv = GetIVs(BTree, self);
  136.     object r; 
  137.     ENTERCRITICALSECTION(iv->iCS); 
  138.     if (*foundKey) { 
  139.         object key = *foundKey; 
  140.         r = gFindBTNGT(iv->iNodes, iv->iCmpFun, key, foundKey); 
  141.     } else 
  142.         r = gFindFirst(self, foundKey); 
  143.     LEAVECRITICALSECTION(iv->iCS); 
  144.     return r; 
  145.  
  146. imeth objrtn BTree_im_gFindLE(object self, object key, object *foundKey)
  147. { BTree_iv_t *iv = GetIVs(BTree, self);
  148.     object r; 
  149.     ENTERCRITICALSECTION(iv->iCS); 
  150.     r = iv->iNodes && iv->iNum ? gFindBTNLE(iv->iNodes, iv->iCmpFun, key, foundKey) : NULLOBJ; 
  151.     LEAVECRITICALSECTION(iv->iCS); 
  152.     return r; 
  153.  
  154. imeth objrtn BTree_im_gFindLT(object self, object key, object *foundKey)
  155. { BTree_iv_t *iv = GetIVs(BTree, self);
  156.     object r; 
  157.     ENTERCRITICALSECTION(iv->iCS); 
  158.     r = iv->iNodes && iv->iNum ? gFindBTNLT(iv->iNodes, iv->iCmpFun, key, foundKey) : NULLOBJ; 
  159.     LEAVECRITICALSECTION(iv->iCS); 
  160.     return r; 
  161.  
  162. imeth objrtn BTree_im_gFindPrev(object self, object *foundKey)
  163. { BTree_iv_t *iv = GetIVs(BTree, self);
  164.     object r; 
  165.     ENTERCRITICALSECTION(iv->iCS); 
  166.     if (*foundKey) { 
  167.         object key = *foundKey; 
  168.         r = gFindBTNLT(iv->iNodes, iv->iCmpFun, key, foundKey); 
  169.     } else 
  170.         r = gFindLast(self, foundKey); 
  171.     LEAVECRITICALSECTION(iv->iCS); 
  172.     return r; 
  173.  
  174. imeth objrtn BTree_im_gFindFirst(object self, object *foundKey)
  175. { BTree_iv_t *iv = GetIVs(BTree, self);
  176.     object r; 
  177.     ENTERCRITICALSECTION(iv->iCS); 
  178.     r = iv->iNodes && iv->iNum ? gFindBTNFirst(iv->iNodes, iv->iCmpFun, foundKey) : NULLOBJ; 
  179.     LEAVECRITICALSECTION(iv->iCS); 
  180.     return r; 
  181.  
  182. imeth objrtn BTree_im_gFindLast(object self, object *foundKey)
  183. { BTree_iv_t *iv = GetIVs(BTree, self);
  184.     object r; 
  185.     ENTERCRITICALSECTION(iv->iCS); 
  186.     r = iv->iNodes && iv->iNum ? gFindBTNLast(iv->iNodes, iv->iCmpFun, foundKey) : NULLOBJ; 
  187.     LEAVECRITICALSECTION(iv->iCS); 
  188.     return r; 
  189.  
  190. imeth objrtn BTree_im_gDisposeObj(object self, object key)
  191. { BTree_iv_t *iv = GetIVs(BTree, self);
  192.     object res; 
  193.     ENTERCRITICALSECTION(iv->iCS); 
  194.     res = iv->iNodes && iv->iNum ? gDeleteBTNode(iv->iNodes, iv->iCmpFun, key, 0, NULL) : NULL; 
  195.     if (res) 
  196.         iv->iNum--; 
  197.     LEAVECRITICALSECTION(iv->iCS); 
  198.     return res; 
  199.  
  200. imeth objrtn BTree_im_gDeepDisposeObj(object self, object key)
  201. { BTree_iv_t *iv = GetIVs(BTree, self);
  202.     object res; 
  203.     ENTERCRITICALSECTION(iv->iCS); 
  204.     res = iv->iNodes && iv->iNum ? gDeleteBTNode(iv->iNodes, iv->iCmpFun, key, 1, NULL) : NULL; 
  205.     if (res) 
  206.         iv->iNum--; 
  207.     LEAVECRITICALSECTION(iv->iCS); 
  208.     return res; 
  209.  
  210. imeth objrtn BTree_im_gPrint(object self, object stream)
  211. { BTree_iv_t *iv = GetIVs(BTree, self);
  212.     ENTERCRITICALSECTION(iv->iCS); 
  213.     vPrintf(stream, "BTree [%8.8lx], %ld keys, first node is %8.8lx\n", self, iv->iNum, iv->iNodes); 
  214.     if (iv->iNodes) { 
  215.         gPuts(stream, "\n------------------------------------------------------------\n"); 
  216.         gPrint(iv->iNodes, stream); 
  217.     } 
  218.     LEAVECRITICALSECTION(iv->iCS); 
  219.     return self; 
  220.  
  221.  
  222. #line 245 "btree.c"
  223.  
  224. objrtn    BTree_initialize(void)
  225. {
  226.     static  CRITICALSECTION  cs;
  227.     static  int volatile once = 0;
  228.  
  229.     ENTERCRITICALSECTION(_CI_CS_);
  230.     if (!once) {
  231.         INITIALIZECRITICALSECTION(cs);
  232.         once = 1;
  233.     }
  234.     LEAVECRITICALSECTION(_CI_CS_);
  235.  
  236.     ENTERCRITICALSECTION(cs);
  237.  
  238.     if (BTree_c) {
  239.         LEAVECRITICALSECTION(cs);
  240.         return BTree_c;
  241.     }
  242.     INHIBIT_THREADER;
  243.     BTree_c = gNewClass(Class, "BTree", sizeof(BTree_iv_t), 0, END);
  244.     cMethodFor(BTree, gNew, BTree_cm_gNew);
  245.     iMethodFor(BTree, gDeepDisposeObj, BTree_im_gDeepDisposeObj);
  246.     iMethodFor(BTree, gSetFunction, BTree_im_gSetFunction);
  247.     iMethodFor(BTree, gFindGE, BTree_im_gFindGE);
  248.     iMethodFor(BTree, gFindLT, BTree_im_gFindLT);
  249.     iMethodFor(BTree, gFindPrev, BTree_im_gFindPrev);
  250.     iMethodFor(BTree, gDisposeObj, BTree_im_gDisposeObj);
  251.     iMethodFor(BTree, gPrint, BTree_im_gPrint);
  252.     iMethodFor(BTree, gDisposeAllNodes, BTree_im_gDisposeAllNodes);
  253.     iMethodFor(BTree, gFindLast, BTree_im_gFindLast);
  254.     iMethodFor(BTree, gSize, BTree_im_gSize);
  255.     iMethodFor(BTree, gDeepDisposeAllNodes, BTree_im_gDeepDisposeAllNodes);
  256.     iMethodFor(BTree, gFindGT, BTree_im_gFindGT);
  257.     iMethodFor(BTree, gDispose, BTree_im_gDispose);
  258.     iMethodFor(BTree, gFindFirst, BTree_im_gFindFirst);
  259.     iMethodFor(BTree, gFindLE, BTree_im_gFindLE);
  260.     iMethodFor(BTree, gFindEQ, BTree_im_gFindEQ);
  261.     iMethodFor(BTree, gSetTopNode, BTree_im_gSetTopNode);
  262.     iMethodFor(BTree, gAddValue, BTree_im_gAddValue);
  263.     iMethodFor(BTree, gDeepDispose, BTree_im_gDeepDispose);
  264.     iMethodFor(BTree, gFindNext, BTree_im_gFindNext);
  265.  
  266.     ENABLE_THREADER;
  267.  
  268.     LEAVECRITICALSECTION(cs);
  269.  
  270.     return BTree_c;
  271. }
  272.  
  273.  
  274.  
  275.